package kgame5.k3d.core.camera {
import kgame5.k3d.core.math.Vector3D;
import kgame5.kmath.MathDG;
import kgame5.kmath.TriMath;

/**
 * @author kangkai
 * TODO 这个是有问题的，原因是0~360角度的时候转动时有问题的，这个可以靠四元数来做
 */
public class SpringCameraBee extends Camera3D{
	//________________________Static_______________________
	
	public static const K:Number=3;//移动到目标的时候的弹簧系数
		
	//摄像机位置
	public var pan:int;//盘旋的角度，z+是0度，x+是90度
	public var radius:int;//到target的距离
	public var y:int;//摄像机高度
	
	//焦点位置
	public var target:Vector3D=new Vector3D(); //需要追踪的焦点人物
	
	//--这个是为了弹簧效果用的
	private var cur_pan:int;
	private var cur_radius:int;
	
	//_______________________Method__________________________
	public function SpringCameraBee(){
		super();
		
		//设置好初始位置
		pan=180;
		radius=900;
		y=900;
		this.place();
		
	}
	
	// 直接放置到目标,这个是为了设置好焦点和当前位置后，直接放置到目标
	public function place():void{
		cur_pan=pan;
		cur_radius=radius;
		v3d_eye.y=y;
		
		v3d_aim.copy(target);
	}

	//判断CMT是否到了目的地
	public function isPosiOK():Boolean{
		return cur_radius==radius&&cur_pan==pan&&v3d_eye.y==y;
	}
	//判断焦点是否到了目标焦点
  	public function isFocusOK():Boolean{
  		return v3d_aim.isEqual(target);
  	}
	
	override public function Update():void {
		
		//--焦点位置
		v3d_aim.x=MathDG.Spring(v3d_aim.x,this.target.x,K);
		v3d_aim.y=MathDG.Spring(v3d_aim.y,this.target.y,K);
		v3d_aim.z=MathDG.Spring(v3d_aim.z,this.target.z,K);
		
		//--摄象机位置
		pan=MathDG.C360(pan);
		cur_pan=MathDG.C360(cur_pan);
		
		cur_radius=MathDG.Spring(cur_radius,radius,K);
		cur_pan=MathDG.Spring(cur_pan,pan,K);
		
		v3d_eye.x = v3d_aim.x + cur_radius*TriMath.sin(cur_pan);
		v3d_eye.z = v3d_aim.z + cur_radius*TriMath.cos(cur_pan);
		
		v3d_eye.y=MathDG.Spring(v3d_eye.y,y,K);
		
		//--很关键的逻辑，计算是Mwc
		super.Update();
	}
}//end of class
}